#include <stdio.h>
#include <string.h>

/* 定义简单的结构 */
struct
{
    unsigned int widthValidated;
    unsigned int heightValidated;
} status1;

/* 定义位域结构 */
struct
{
    unsigned int widthValidated : 1;
    unsigned int heightValidated : 1;
} status2;

struct packed_struct
{
    unsigned int f1 : 1;     // 1位的位域
    unsigned int f2 : 1;     // 1位的位域
    unsigned int f3 : 1;     // 1位的位域
    unsigned int f4 : 1;     // 1位的位域
    unsigned int type : 4;   // 4位的位域
    unsigned int my_int : 9; // 9位的位域
};
struct
{
    unsigned int age : 3;
} Age;
int main()
{
    printf("Memory size occupied by status1 : %d\n", sizeof(status1));
    printf("Memory size occupied by status2 : %d\n", sizeof(status2));

    struct packed_struct pack;

    pack.f1 = 1;
    pack.f2 = 0;
    pack.f3 = 1;
    pack.f4 = 0;
    pack.type = 7;
    pack.my_int = 255;

    printf("f1: %u\n", pack.f1);
    printf("f2: %u\n", pack.f2);
    printf("f3: %u\n", pack.f3);
    printf("f4: %u\n", pack.f4);
    printf("type: %u\n", pack.type);
    printf("my_int: %u\n", pack.my_int);

    Age.age = 4;
    printf("Sizeof( Age ) : %d\n", sizeof(Age));
    printf("Age.age : %d\n", Age.age);

    Age.age = 7;
    printf("Age.age : %d\n", Age.age);

    // Age.age = 8; // 二进制表示为 1000 有四位，超出
    // printf("Age.age : %d\n", Age.age);

    struct bs
    {
        unsigned a : 1;
        unsigned b : 3;
        unsigned c : 4;
    } bit, *pbit;
    bit.a = 1;                                       /* 给位域赋值（应注意赋值不能超过该位域的允许范围） */
    bit.b = 7;                                       /* 给位域赋值（应注意赋值不能超过该位域的允许范围） */
    bit.c = 15;                                      /* 给位域赋值（应注意赋值不能超过该位域的允许范围） */
    printf("%d,%d,%d\n", bit.a, bit.b, bit.c);       /* 以整型量格式输出三个域的内容 */
    pbit = &bit;                                     /* 把位域变量 bit 的地址送给指针变量 pbit */
    pbit->a = 0;                                     /* 用指针方式给位域 a 重新赋值，赋为 0 */
    pbit->b &= 3;                                    /* 使用了复合的位运算符 "&="，相当于：pbit->b=pbit->b&3，位域 b 中原有值为 7，与 3 作按位与运算的结果为 3（111&011=011，十进制值为 3） */
    pbit->c |= 1;                                    /* 使用了复合位运算符"|="，相当于：pbit->c=pbit->c|1，其结果为 15 */
    printf("%d,%d,%d\n", pbit->a, pbit->b, pbit->c); /* 用指针方式输出了这三个域的值 */

    return 0;
}